package main

import "fmt"

/*
 Map
 1.Map的操作
 (1) 创建：make(map[string]int)
 (2) 获取元素: m[key]
 (3) key不存在时,获得Value类型的初始值
 (4) 用value,ok := m[key] 来判断是否存在key
 (5) 用delete删除一个key
 2.Map的遍历
 (1) 使用range遍历key,或者遍历key,value对
 (2) 不保证遍历顺序,如需顺序,需要手动key排序
 (3) 使用len获得元素个数
 3.map的key
 (1) map使用哈希表,必须可以比较相等
 (2) 除了slice,map,function的内建类型都可以作为key
 (3) Struct类型不包含上述字段，也可以作为key
*/
func main() {
	// 方式1：创建map
	m := map[string]string{
		"name":    "trt",
		"course":  "golang",
		"site":    "imooc",
		"quality": "notbad",
	}
	// 方式2：创建map，空map
	m2 := make(map[string]int) // m2 == empty map

	// 方式3：创建map，空map
	var m3 map[string]int // m3 == nil

	fmt.Println(m, m2, m3)

	fmt.Println("Traversing map")
	for k, v := range m {
		fmt.Println(k, v)
	}

	fmt.Println("Getting values")
	courseName, ok := m["course"]
	fmt.Println(courseName, ok)
	if causeName, ok := m["cause"]; ok {
		fmt.Println(causeName)
	} else {
		fmt.Println("key does not exist")
	}

	fmt.Println("Deleting values")
	name, ok := m["name"]
	fmt.Println(name, ok)

	delete(m, "name")
	name, ok = m["name"]
	fmt.Println(name, ok)

}

// 例：寻找最长不含有重复字符的子串
// (1)abcabcbb -> abc
